package com.itheima.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.bean.Category;
import com.itheima.bean.Dish;
import com.itheima.bean.DishFlavor;
import com.itheima.common.PageBean;
import com.itheima.common.R;
import com.itheima.dto.DishDto;
import com.itheima.service.CategoryService;
import com.itheima.service.DishFlavorService;
import com.itheima.service.DishService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@RequestMapping("/dish")
@RestController
public class DishController {

    @Autowired
    private DishService dishService;

    @Autowired
    private CategoryService categoryService;

    @Autowired
    private DishFlavorService dishFlavorService;

    /**
     * 新增菜品
     * @param dishDto
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody DishDto dishDto){
        //1.调用service完成菜品新增
        dishService.saveWithFlavors(dishDto);

        //2.返回新增成功
        return R.success("新增成功！");
    }

    /**
     * 菜品分页查看
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R<PageBean> page(@RequestParam(defaultValue="1") Integer page, @RequestParam(defaultValue="10") Integer pageSize, String name){
        //0.配置MyBatisPlus分页拦截器 【已经配置完成】
        //1.创建Page对象 设置分页参数【当前页码、每页显示条数】
        Page<Dish> dishPage = new Page<>(page, pageSize);

        //2.创建wrapper对象 设置查询条件【菜品名称 name】
        LambdaQueryWrapper<Dish> dishLambdaQueryWrapper = new LambdaQueryWrapper<>();
        dishLambdaQueryWrapper.like(name!=null&&name.length()>0,Dish::getName,name);

        //3.调用Service方法完成分页查询
        dishService.page(dishPage,dishLambdaQueryWrapper);

        //4.将分页查询的当前页数据和总条数封装到PageBean对象中，响应给客户端
        List<Dish> dishList = dishPage.getRecords();  //当前页菜品数据列表集合
        long total = dishPage.getTotal();             //总条数

        /*
            原因分析：
                1.正常的分页查询响应给页面的显示数据是dishList集合 是List<Dish>类型的
                2.这样在页面显示时 每一条记录对应的都是dishList集合中的一个元素 也就是一个Dish对象
                3.由于页面每一条菜品记录都要显示对应的所属分类名称categoryName
                4.但是dish对象中只有菜品所属分类id  没有分类名称  所以导致了每一条菜品记录显示时 菜品所属分类为空 不显示
            解决分析：
                1.在后台进行菜品分页查询时，响应给页面显示的每一条菜品记录都应该包含菜品的基本信息 和 所属分类名称
                    dish对象+categoryName    ==>    DishDto对象
                2.我们要响应给页面显示的每一条菜品记录都应该是一个DishDto对象
                3.而我们这里做的是分页查询 响应给页面的是当前页数据集合 因此这个集合应该是List<DishDto>
                4.创建一个DishDto对象封装菜品基本信息和所属分类名称   然后都存入到List<DishDto>集合中返回
            实现步骤：
                1.创建一个List<Dish> DishDtoList集合对象
                2.循环遍历原有的List<Dish> dishList集合
                3.将每一个Dish对象中属性数据赋值到DishDto对象中 并且根据分类id查询分类名称赋值到DishDto对象的categoryName属性上
                4.将每一个DishDto对象存入到DishDtoList集合中
                5.将DishDtoList集合封装到PageBean对象中返回
         */
        //优化：将List<Dish> dishList 转换为 List<DishDto> dishDtoList
        //a：创建一个DishDtoList集合对象
        List<DishDto> dishDtoList = new ArrayList<>();

        //b：循环遍历dishList集合
        for (Dish dish : dishList) {
            DishDto dishDto = new DishDto();

            //c：将每一个dish对象中属性数据赋值到DishDto对象中 并且根据分类id查询分类名称赋值到DishDto对象的categoryName属性上
            BeanUtils.copyProperties(dish,dishDto);
            Category category = categoryService.getById(dish.getCategoryId());
            dishDto.setCategoryName(category==null?"未知":category.getName());

            //d：将每一个DishDto对象存入到DishDtoList集合中
            dishDtoList.add(dishDto);
        }

        PageBean pageBean = new PageBean(dishDtoList, total);
        return R.success(pageBean);
    }


    /**
     * 根据id查询菜品信息
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R<DishDto> getById(@PathVariable Long id){
        //1.调用service完成业务处理
        DishDto dishDto = dishService.getByIdWithFlavors(id);

        //2.返回处理结果
        return R.success(dishDto);
    }


    /**
     * 菜品修改
     * @param dishDto
     * @return
     */
    @PutMapping
    public R<String> update(@RequestBody DishDto dishDto){
        //1.调用service完成业务处理
        dishService.updateWithFlavors(dishDto);

        //2.响应修改成功
        return R.success("修改成功！");
    }


    /**
     * 根据菜品分类查询指定分类下的菜品列表数据
     * @param dish
     * @return
     */
    @GetMapping("/list")
    public R<List<DishDto>> list(Dish dish){
        //1.创建查询条件 根据分类id和状态条件
        LambdaQueryWrapper<Dish> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(dish.getCategoryId()!=null,Dish::getCategoryId,dish.getCategoryId());
        wrapper.eq(dish.getStatus()!=null,Dish::getStatus,dish.getStatus());

        //2.调用service完成查询
        List<Dish> list = dishService.list(wrapper);

        //3.将查询结果封装到List<DishDto>对象中
        List<DishDto> dishDtoList = list.stream().map(item -> {
            //a：创建DishDto对象
            DishDto dishDto = new DishDto();

            //b：将dish对象属性数据复制到dishDto对象中
            BeanUtils.copyProperties(item,dishDto);

            //c：根据菜品id去菜品口味表中查询当前菜品口味信息封装到dishDto对象的flavors上
            LambdaQueryWrapper<DishFlavor> dishFlavorLambdaQueryWrapper = new LambdaQueryWrapper<>();
            dishFlavorLambdaQueryWrapper.eq(DishFlavor::getDishId,item.getId());
            List<DishFlavor> flavors = dishFlavorService.list(dishFlavorLambdaQueryWrapper);
            dishDto.setFlavors(flavors);

            //d：返回dishDto对象
            return dishDto;
        }).collect(Collectors.toList());

        //4.返回List<DishDto>
        return R.success(dishDtoList);
    }

    /*@GetMapping("/list")
    public R<List<Dish>> list(Long categoryId){
        //1.调用service完成业务处理
        LambdaQueryWrapper<Dish> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(categoryId!=null,Dish::getCategoryId,categoryId);
        List<Dish> list = dishService.list(wrapper);

        //2.返回菜品列表数据
        return R.success(list);
    }*/
//根据菜品id删除|批量删除
    @DeleteMapping()
    public R<String> delete(Long[] ids) {
        // 1.调用service
        boolean flag = dishService.deleteByIds(ids);

        // 2.响应数据
        return flag ? R.success("删除成功") : R.error("删除失败");
    }

    //停售启售|批量停售启售
    @PostMapping("/status/{status}")
    public R<String> changeStatus(Long[] ids, @PathVariable Integer status) {
        // 调用service
        dishService.changeStatusByIds(ids, status);
        // 响应数据
        return R.success("修改成功");
    }

}
